package com.hb.core.pojo.flow.dto;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.pinyin.PinyinUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.hb.core.pojo.flow.entity.FlowTempFormField;
import com.hb.core.pojo.flow.entity.FlowTempMain;
import com.hb.core.pojo.flow.mapper.FlowTempMainMapper;
import lombok.Getter;
import lombok.Setter;

import java.util.List;
import java.util.Set;

/**
 * 流程模板数据传输对象
 *
 * @author zhaojk
 */
@Setter
@Getter
public class FlowTempMainDTO extends FlowTempMain {
    /**
     * 发起流程时发起人ID
     * 一般为当前登录用户
     */
    private Long userId;
    /**
     * 审批节点
     */
    private FlowTempNodeDTO tempNode;
    /**
     * 所有的审批节点集合
     */
    private List<FlowTempNodeDTO> nodeDtos;
    /**
     * 自定义表单字段集合
     */
    private List<FlowTempFormFieldDTO> formFields;

    /**
     * 流程定义参数验证
     *
     * @return
     */
    public String paramsValid() {
        /* 流程主体信息验证 start */
        // 流程名称
        String flowName = this.getFlowName();
        if (StrUtil.isEmpty(flowName)) {
            return "流程名称不能为空";
        }
        FlowTempMainMapper tempMainMapper = SpringUtil.getBean(FlowTempMainMapper.class);

        int count = tempMainMapper.countByName(flowName);
        if (count > 0) {
            return "该流程名称已经存在";
        }
        // 启用标志
        Integer enable = this.getEnableFlag();
        if (enable == null) {
            this.setEnableFlag(1);
        }
        Integer flowType = this.getFlowType();
        if (flowType == null) {
            return "必须指定流程类型";
        }
        /* 流程表单信息验证 start */
        List<FlowTempFormFieldDTO> formFields = this.getFormFields();
        if (getFormId() == null && CollUtil.isEmpty(formFields)) {
            return "必须关联表单";
        }
        if (CollUtil.isNotEmpty(formFields)) {
            // 利用Set集合的不可重复特性
            Set<String> fieldNames = CollUtil.set(false);
            for (FlowTempFormField formField : formFields) {
                fieldNames.add(PinyinUtil.getPinyin(formField.getFieldName(), ""));
            }
            if (fieldNames.size() != formFields.size()) {
                return "表单中有重复字段";
            }
        }
        /* 流程节点息验证 start */
        FlowTempNodeDTO tempNode = this.getTempNode();
        if (tempNode == null || tempNode.getNextNode() == null) {
            return "至少设置两个流程节点";
        }

        return null;
    }
}
